package com.example.huawei.system.result;

import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.Date;

@Data
@ApiModel(description = "通用响应结果")
public class Result<T> {
    @ApiModelProperty(value = "状态码")
    private Integer code;

    @ApiModelProperty(value = "响应信息")
    private String msg;

    @ApiModelProperty(value = "是否成功")
    private Boolean success;

    @ApiModelProperty(value = "响应内容")
    private T result; // 使用泛型 T

    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "数据添加时间")
    private Date resDate;

    // 私有构造函数，防止直接实例化
    private Result() {
    }

    // 静态工厂方法：成功，无数据
    public static <T> Result<T> ok() {
        Result<T> r = new Result<>();
        r.setCode(200);
        r.setSuccess(true);
        r.setResDate(new Date());
        return r;
    }

    // 静态工厂方法：失败，无数据
    public static <T> Result<T> error() {
        Result<T> r = new Result<>();
        r.setCode(-1);
        r.setSuccess(false);
        r.setResDate(new Date());
        return r;
    }

    // 静态工厂方法：成功，并携带数据
    // 修正：直接构建对象，避免类型推断问题
    public static <T> Result<T> ok(T res) {
        Result<T> r = new Result<>();
        r.setCode(200);
        r.setSuccess(true);
        r.setResDate(new Date());
        r.setResult(res); // 设置结果数据
        return r;
    }

    // 静态工厂方法：失败，并携带数据
    // 修正：直接构建对象，避免类型推断问题
    public static <T> Result<T> error(T res) {
        Result<T> r = new Result<>();
        r.setCode(-1);
        r.setSuccess(false);
        r.setResDate(new Date());
        r.setResult(res); // 设置结果数据 (虽然不常见，但语法上可行)
        return r;
    }

    // 设置响应数据 (用于链式调用)
    public Result<T> entity(T res) {
        this.result = res;
        return this;
    }

    // 设置响应信息 (用于链式调用)
    public Result<T> message(String message) {
        this.msg = message;
        return this;
    }

    // 设置状态码 (用于链式调用)
    public Result<T> code(Integer code) {
        this.code = code;
        return this;
    }
}



